broadway: More multi-display fixes
authorAlexander Larsson <alexl@redhat.com>
Fri, 29 Mar 2019 10:13:24 +0000 (11:13 +0100)
committerAlexander Larsson <alexl@redhat.com>
Fri, 29 Mar 2019 13:30:13 +0000 (14:30 +0100)
When doing idle flushing, do so per display rather than a global
and some find_display hack.

gdk/broadway/gdkdisplay-broadway.c
gdk/broadway/gdkdisplay-broadway.h
gdk/broadway/gdkprivate-broadway.h
gdk/broadway/gdksurface-broadway.c

index 4cb868c635da6917830bb4cca19fea2da56d1e19..e3ba560f88417e572f4764d357c429b1d7bb5a7c 100644 (file)
@@ -386,6 +386,31 @@ gdk_broadway_display_ensure_texture (GdkDisplay *display,
   return data->id;
 }
 
+static gboolean
+flush_idle (gpointer data)
+{
+  GdkDisplay *display = data;
+  GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (display);
+
+  broadway_display->idle_flush_id = 0;
+  gdk_display_flush (display);
+
+  return FALSE;
+}
+
+void
+gdk_broadway_display_flush_in_idle (GdkDisplay *display)
+{
+  GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (display);
+
+  if (broadway_display->idle_flush_id == 0)
+    {
+      broadway_display->idle_flush_id = g_idle_add (flush_idle, g_object_ref (display));
+      g_source_set_name_by_id (broadway_display->idle_flush_id, "[gtk] flush_idle");
+    }
+}
+
+
 static void
 gdk_broadway_display_class_init (GdkBroadwayDisplayClass * class)
 {
index e028381c540e47e7c2fa94d06bdfa3a57128681c..a8d6819c8292ddc7b0dcee3856d75007f85d51ad 100644 (file)
@@ -56,6 +56,8 @@ struct _GdkBroadwayDisplay
   GdkMonitor *monitor;
 
   GHashTable *texture_cache;
+
+  guint idle_flush_id;
 };
 
 struct _GdkBroadwayDisplayClass
index ec6393606baab49aee4ac6f41acbd34fde26fe05..6f9e126dff4fbdda117305512e64afe0a401960a 100644 (file)
@@ -41,6 +41,8 @@
 guint32 gdk_broadway_display_ensure_texture (GdkDisplay *display,
                                              GdkTexture *texture);
 
+void gdk_broadway_display_flush_in_idle (GdkDisplay *display);
+
 void gdk_broadway_surface_set_nodes (GdkSurface *surface,
                                      GArray *nodes,
                                      GPtrArray *node_textures);
index f5a11a3167e4a25b35d51d3bb986bd175f8c6b09..580f1fecf3fc7b5907f87709a5973e3fe3b6c666 100644 (file)
@@ -73,39 +73,6 @@ G_DEFINE_TYPE (GdkSurfaceImplBroadway,
                gdk_surface_impl_broadway,
                GDK_TYPE_SURFACE_IMPL)
 
-static GdkDisplay *
-find_broadway_display (void)
-{
-  GdkDisplay *display;
-  GSList *list, *l;
-
-  display = NULL;
-
-  list = gdk_display_manager_list_displays (gdk_display_manager_get ());
-  for (l = list; l; l = l->next)
-    {
-      if (GDK_IS_BROADWAY_DISPLAY (l->data))
-        {
-          display = l->data;
-          break;
-        }
-    }
-  g_slist_free (list);
-
-  return display;
-}
-
-static guint flush_id = 0;
-
-static gboolean
-flush_idle (gpointer data)
-{
-  flush_id = 0;
-
-  gdk_display_flush (find_broadway_display ());
-
-  return FALSE;
-}
 
 /* We need to flush in an idle rather than AFTER_PAINT, as the clock
    is frozen during e.g. surface resizes so the paint will not happen
@@ -113,11 +80,7 @@ flush_idle (gpointer data)
 static void
 queue_flush (GdkSurface *surface)
 {
-  if (flush_id == 0)
-    {
-      flush_id = g_idle_add (flush_idle, NULL);
-      g_source_set_name_by_id (flush_id, "[gtk] flush_idle");
-    }
+  gdk_broadway_display_flush_in_idle (gdk_surface_get_display (surface));
 }
 
 static void